<?php
/**
 * 自动加载器
 * @param className 类名
 * */
function loadClass($className) {
    $fileName = '';
    $namespace = '';

    // 命名空间前缀
    $namespacePrefix = 'app\\';
    if (substr($className, 0, 4) !== $namespacePrefix) {
        echo '类名必须以app\打头:' . $className;
        return;
    }

    // 去除前缀
    $clazz = substr($className, 4);

    // 获取当前文件路径
    $includePath = dirname(__FILE__);

    // 获取\最后一次出现的位置，比如className = controller\UserController;，则后出现的\的位置为4
    // 未获取到则说明是根路径，什么也不执行
    if (false !== ($lastNsPos = strripos($clazz, '\\'))) {
        // 获取命名空间，比如为：controller
        $namespace = substr($clazz, 0, $lastNsPos);
        // 获取类名，比如为：UserController
        $clazz = substr($clazz, $lastNsPos + 1);
        // 接拼文件名
        $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }

    // 加入.php后缀
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $clazz) . '.php';

    // 获取文件绝对路径
    $fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;
    if (file_exists($fullFileName)) {
        // 存在则引用
        require $fullFileName;
    } else {
        // 否则输出错误信息
        echo 'Class "'.$className.'" can\'t found: file "' . $fullFileName . '" not exist';
    }
}

// 注意自动加载器，配合命名空间使用
spl_autoload_register('loadClass');